package com.bytedesk.bytedesk_push.mi;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;

import com.xiaomi.mipush.sdk.ErrorCode;
import com.xiaomi.mipush.sdk.MiPushClient;
import com.xiaomi.mipush.sdk.MiPushCommandMessage;
import com.xiaomi.mipush.sdk.MiPushMessage;
import com.xiaomi.mipush.sdk.PushMessageReceiver;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import com.orhanobut.logger.Logger;
import com.bytedesk.bytedesk_push.BytedeskPushPlugin;

/**
 * 1、PushMessageReceiver 是个抽象类，该类继承了 BroadcastReceiver。<br/>
 * 2、需要将自定义的 DemoMessageReceiver 注册在 AndroidManifest.xml 文件中：
 * 
 * <pre>
 * {@code
 *  <receiver
 *      android:name="com.xiaomi.mipushdemo.DemoMessageReceiver"
 *      android:exported="true">
 *      <intent-filter>
 *          <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
 *      </intent-filter>
 *      <intent-filter>
 *          <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
 *      </intent-filter>
 *      <intent-filter>
 *          <action android:name="com.xiaomi.mipush.ERROR" />
 *      </intent-filter>
 *  </receiver>
 *  }
 * </pre>
 * 
 * 3、DemoMessageReceiver 的 onReceivePassThroughMessage
 * 方法用来接收服务器向客户端发送的透传消息。<br/>
 * 4、DemoMessageReceiver 的 onNotificationMessageClicked 方法用来接收服务器向客户端发送的通知消息，
 * 这个回调方法会在用户手动点击通知后触发。<br/>
 * 5、DemoMessageReceiver 的 onNotificationMessageArrived 方法用来接收服务器向客户端发送的通知消息，
 * 这个回调方法是在通知消息到达客户端时触发。另外应用在前台时不弹出通知的通知消息到达客户端也会触发这个回调函数。<br/>
 * 6、DemoMessageReceiver 的 onCommandResult 方法用来接收客户端向服务器发送命令后的响应结果。<br/>
 * 7、DemoMessageReceiver 的 onReceiveRegisterResult
 * 方法用来接收客户端向服务器发送注册命令后的响应结果。<br/>
 * 8、以上这些方法运行在非 UI 线程中。
 *
 * @author mayixiang
 */
public class MiPushMessageReceiver extends PushMessageReceiver {

    private String mRegId;
    private String mTopic;
    private String mAlias;
    private String mAccount;
    private String mStartTime;
    private String mEndTime;

    // BinaryMessenger getFlutterView() {
    //     return getFlutterEngine().getDartExecutor().getBinaryMessenger();
    // }

    @Override
    public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
        Logger.d("onReceivePassThroughMessage is called. " + message.toString());
        // String log = context.getString(R.string.recv_passthrough_message,
        // message.getContent());
        // MainActivity.logList.add(0, getSimpleDate() + " " + log);

        // if (!TextUtils.isEmpty(message.getTopic())) {
        // mTopic = message.getTopic();
        // } else if (!TextUtils.isEmpty(message.getAlias())) {
        // mAlias = message.getAlias();
        // }

        // Message msg = Message.obtain();
        // msg.obj = log;
        // getHandler().sendMessage(msg);
    }

    @Override
    public void onNotificationMessageClicked(Context context, MiPushMessage message) {
        Logger.d("onNotificationMessageClicked is called. " + message.toString());
        // String log = context.getString(R.string.click_notification_message,
        // message.getContent());
        // MainActivity.logList.add(0, getSimpleDate() + " " + log);

        // if (!TextUtils.isEmpty(message.getTopic())) {
        // mTopic = message.getTopic();
        // } else if (!TextUtils.isEmpty(message.getAlias())) {
        // mAlias = message.getAlias();
        // }

        // Message msg = Message.obtain();
        // if (message.isNotified()) {
        // msg.obj = log;
        // }
        // getHandler().sendMessage(msg);
    }

    @Override
    public void onNotificationMessageArrived(Context context, MiPushMessage message) {
        // onNotificationMessageArrived is called.
        // messageId={udm61536616298190383yq},passThrough={0},alias={null},topic={null},userAccount={liangshi_test_userAccount},content={12345},description={12345},title={测试小米消息通知-良师},isNotified={false},notifyId={0},notifyType={1},
        // category={null}, extra={{__uc=liangshi_test_userAccount, notify_effect=1,
        // fe_ts=1616298190383, __m_ts=1616298190700,
        // n_stats_expose=oX18eR0ntI3rIgms+xOJpYuFkjcGJ05NgAvFXauWf+9jt2DpAuMeuWcspX8HRkW52frTOaLHEWXNin04CINB86bs8Xujdj3iaEBThaNS9O68v3vgb8s+28JtTWbPWDjs}}
        Logger.d("onNotificationMessageArrived is called. " + message.toString());
        BytedeskPushPlugin.sendMessage(message);
        //
        // String log = context.getString(R.string.arrive_notification_message,
        // message.getContent());
        // MainActivity.logList.add(0, getSimpleDate() + " " + log);

        // if (!TextUtils.isEmpty(message.getTopic())) {
        // mTopic = message.getTopic();
        // } else if (!TextUtils.isEmpty(message.getAlias())) {
        // mAlias = message.getAlias();
        // }

        // Message msg = Message.obtain();
        // msg.obj = log;
        // getHandler().sendMessage(msg);
    }

    @Override
    public void onCommandResult(Context context, MiPushCommandMessage message) {
        Logger.d("onCommandResult is called. " + message.toString());
        // String command = message.getCommand();
        // List<String> arguments = message.getCommandArguments();
        // String cmdArg1 = ((arguments != null && arguments.size() > 0) ?
        // arguments.get(0) : null);
        // String cmdArg2 = ((arguments != null && arguments.size() > 1) ?
        // arguments.get(1) : null);
        // String log;
        // if (MiPushClient.COMMAND_REGISTER.equals(command)) {
        // if (message.getResultCode() == ErrorCode.SUCCESS) {
        // mRegId = cmdArg1;
        // log = context.getString(R.string.register_success);
        // } else {
        // log = context.getString(R.string.register_fail);
        // }
        // } else if (MiPushClient.COMMAND_SET_ALIAS.equals(command)) {
        // if (message.getResultCode() == ErrorCode.SUCCESS) {
        // mAlias = cmdArg1;
        // log = context.getString(R.string.set_alias_success, mAlias);
        // } else {
        // log = context.getString(R.string.set_alias_fail, message.getReason());
        // }
        // } else if (MiPushClient.COMMAND_UNSET_ALIAS.equals(command)) {
        // if (message.getResultCode() == ErrorCode.SUCCESS) {
        // mAlias = cmdArg1;
        // log = context.getString(R.string.unset_alias_success, mAlias);
        // } else {
        // log = context.getString(R.string.unset_alias_fail, message.getReason());
        // }
        // } else if (MiPushClient.COMMAND_SET_ACCOUNT.equals(command)) {
        // if (message.getResultCode() == ErrorCode.SUCCESS) {
        // mAccount = cmdArg1;
        // log = context.getString(R.string.set_account_success, mAccount);
        // } else {
        // log = context.getString(R.string.set_account_fail, message.getReason());
        // }
        // } else if (MiPushClient.COMMAND_UNSET_ACCOUNT.equals(command)) {
        // if (message.getResultCode() == ErrorCode.SUCCESS) {
        // mAccount = cmdArg1;
        // log = context.getString(R.string.unset_account_success, mAccount);
        // } else {
        // log = context.getString(R.string.unset_account_fail, message.getReason());
        // }
        // } else if (MiPushClient.COMMAND_SUBSCRIBE_TOPIC.equals(command)) {
        // if (message.getResultCode() == ErrorCode.SUCCESS) {
        // mTopic = cmdArg1;
        // log = context.getString(R.string.subscribe_topic_success, mTopic);
        // } else {
        // log = context.getString(R.string.subscribe_topic_fail, message.getReason());
        // }
        // } else if (MiPushClient.COMMAND_UNSUBSCRIBE_TOPIC.equals(command)) {
        // if (message.getResultCode() == ErrorCode.SUCCESS) {
        // mTopic = cmdArg1;
        // log = context.getString(R.string.unsubscribe_topic_success, mTopic);
        // } else {
        // log = context.getString(R.string.unsubscribe_topic_fail,
        // message.getReason());
        // }
        // } else if (MiPushClient.COMMAND_SET_ACCEPT_TIME.equals(command)) {
        // if (message.getResultCode() == ErrorCode.SUCCESS) {
        // mStartTime = cmdArg1;
        // mEndTime = cmdArg2;
        // log = context.getString(R.string.set_accept_time_success, mStartTime,
        // mEndTime);
        // } else {
        // log = context.getString(R.string.set_accept_time_fail, message.getReason());
        // }
        // } else {
        // log = message.getReason();
        // }
        // MainActivity.logList.add(0, getSimpleDate() + " " + log);

        // Message msg = Message.obtain();
        // msg.obj = log;
        // getHandler().sendMessage(msg);
    }

    @Override
    public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
        Logger.d("onReceiveRegisterResult is called. " + message.toString());
        // String command = message.getCommand();
        // List<String> arguments = message.getCommandArguments();
        // String cmdArg1 = ((arguments != null && arguments.size() > 0) ?
        // arguments.get(0) : null);
        // String log;
        // if (MiPushClient.COMMAND_REGISTER.equals(command)) {
        // if (message.getResultCode() == ErrorCode.SUCCESS) {
        // mRegId = cmdArg1;
        // log = context.getString(R.string.register_success);
        // } else {
        // log = context.getString(R.string.register_fail);
        // }
        // } else {
        // log = message.getReason();
        // }

        // Message msg = Message.obtain();
        // msg.obj = log;
        // getHandler().sendMessage(msg);

        // 当注册结果到来的时候，我把它存入共享参数
        if (message != null && message.getCommandArguments() != null && message.getCommandArguments().size() > 0) {
            // 保存RegisId
            saveRegisterId(context, message.getCommandArguments().get(0));
        }
    }

    // 保存参数
    private void saveRegisterId(Context context, String regId) {
        if (null == context || regId.isEmpty())
            return;
        // 覆盖模式
        // SharedPreferences preferences =
        // context.getSharedPreferences(BaseConstants.DATA_Reg,Context.MODE_PRIVATE);
        // SharedPreferences.Editor editor= preferences.edit();
        // editor.putString(BaseConstants.RegIdTag,regId);
        // editor.commit();
    }

    @SuppressLint("SimpleDateFormat")
    private static String getSimpleDate() {
        return new SimpleDateFormat("MM-dd hh:mm:ss").format(new Date());
    }

}
